home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Portable Patmos / src / portable kernel / mac / 68XXX-VM.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-27  |  4.6 KB  |  244 lines  |  [TEXT/KAHL]

  1. #include "crtlocal.h"
  2. #include "proc_mmu.h"
  3.  
  4.  
  5. long get_68020_tc()
  6. {
  7. return 0;
  8. }
  9. void get_68020_crp(long *vec)
  10. {
  11. vec[0] = 127;
  12. vec[1] = 0;
  13. }
  14. void get_68020_srp(long *vec)
  15. {
  16. vec[0] = 127;
  17. vec[1] = 0;
  18. }
  19. void put_68020_crp(long *vec)
  20. {
  21. }
  22. void flush_68020_caches(void)
  23. {
  24. }
  25. void flush_68020_mmu_caches(void)
  26. {
  27. }
  28. pascal void trap_patch_68020_0(void)
  29. {
  30. static long saved_usp;
  31. ;
  32. {
  33. struct userregs save;
  34. asm {
  35. movem.l d0-d7/a0-a5,save.save
  36. move.l (a6),save.save[14]
  37. move.w 4(a6),save.flags
  38. move.l 6(a6),save.pc
  39. };
  40. SetCurrentA5();
  41. save.save[15] = usp();
  42. if (0x2000&~save.flags)
  43. {
  44. if (virtual) put_usp(saved_usp);
  45. crp->registers = save;
  46. crp->state = 'D';
  47. }
  48. else crp->state = 'R';
  49. if (virtual)
  50. {
  51. asm
  52. {
  53. move.w save.flags,sr
  54. }
  55. }
  56. }
  57. kernel_memcpy(system_vectors, supervisor_vectors, vec_patch_size);
  58. sched();
  59. {
  60. struct userregs save;
  61. put_user_root((long)crp);
  62. if (virtual)
  63. {
  64. EnterSupervisorMode();
  65. saved_usp = usp();
  66. }
  67. else upper_space(crp, crp->stack_limit-save.save[15]+stack_headroom);
  68. save = crp->registers;
  69. put_usp(save.save[15]);
  70. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  71. ;
  72. ;
  73. asm
  74. {
  75. move.l save.save[14],(a6)
  76. move.w save.flags,4(a6)
  77. move.l save.pc,6(a6)
  78. movem.l save.save,d0-d7/a0-a5
  79. unlk a6
  80. rte
  81. };
  82. }
  83. }
  84. pascal void trap_patch_68020_1(unsigned short fault)
  85. {
  86. unsigned short kind;
  87. long newstacksize,phys_pc;
  88. struct userregs save;
  89. ;
  90. asm {
  91. movem.l d0-d7/a0-a5,save.save
  92. };
  93. SetCurrentA5();
  94. kernel_memcpy(system_vectors, supervisor_vectors, vec_patch_size);
  95. newstacksize = crp->stack_limit-usp()+stack_headroom;
  96. if ((newstacksize<stack_headroom)
  97. || newstacksize > crp->maxstack
  98. || ((long)(LTP(usp()))!=-1)
  99. || upper_space(crp, newstacksize))
  100. {
  101. int i,k;
  102. unsigned short ssw,*fault_frame = &fault;
  103. save.save[15] = usp();
  104. asm {
  105. move.l (a6),save.save[14]
  106. move.w 4(a6),save.flags
  107. move.l 6(a6),save.pc
  108. move.w 10(a6),kind
  109. };
  110. if (virtual) asm
  111. {
  112. move.w save.flags,sr
  113. }
  114. k = kind >> 12;
  115. kind &= 4095;
  116. if ((kind == (46<<2)) && (get_user_root()==(long)swapper))
  117. {
  118. save.pc -= 2;
  119. crp->registers = save;
  120. sched();
  121. }
  122. else if (crp->trace_me && (0x2000&~save.flags)
  123. && (((kind)==(9<<2))||((kind)==(47<<2))))
  124. {
  125. save.flags &= ~0xC000;
  126. crp->registers = save;
  127. crp->state = 'T';
  128. crp->result = W_STOPCODE(SIGTRAP);
  129. sched();
  130. }
  131. else
  132. {
  133. crp->result = SIGTERM;
  134. if (!crp->trace_me)
  135. {
  136. debug = 0;
  137. kprintf("Saved PC = %X USP = %X URP = %X SR = %X\n",
  138. save.pc,
  139. save.save[15],
  140. (long)crp, save.flags);
  141. kprintf("Exception vector = %X, kind = %d\n",
  142. kind, k);
  143. for (i = 0; i < 8; i++)
  144. kprintf("D%d = %8.8X    A%d = %8.8X\n", i, save.save[i], i, save.save[i+8]);
  145. }
  146. switch ((kind)>>2)
  147. {
  148. case 32: case 33: case 34: case 35:
  149. case 36: case 37: case 38: case 39:
  150. case 40: case 41: case 42: case 43:
  151. case 44: case 45: case 46: case 47:
  152. crp->result = SIGTRAP;
  153. if (!crp->trace_me) kprintf("trap #%d \n", ((kind)>>2)-32);
  154. break;
  155. case 2:
  156. if (!crp->trace_me)
  157. {
  158. int i,addr;
  159. kprintf("bus error - Fault frame:\n");
  160. for (i = 4; i < 14; i++)
  161. {
  162. kprintf("%4.4X ", fault_frame[i]);
  163. }
  164. ssw = fault_frame[4];
  165. addr = *(long *)&fault_frame[8];
  166. kprintf("\nAccessing fault address %8.8X (kmem=%8.8X)\n", addr, LTP(addr));
  167. }
  168. crp->result = SIGBUS;
  169. break;
  170. case 3: if (!crp->trace_me) kprintf("address error\n");
  171. crp->result = SIGBUS; break;
  172. case 4: if (!crp->trace_me) kprintf("illegal inst\n");
  173. crp->result = SIGILL; break;
  174. case 5: if (!crp->trace_me) kprintf("zero divide\n");
  175. break;
  176. case 6: if (!crp->trace_me) kprintf("range error\n");
  177. break;
  178. case 7: if (!crp->trace_me) kprintf("trapv\n");
  179. break;
  180. case 8: if (!crp->trace_me) kprintf("privilege\n");
  181. break;
  182. case 9: if (!crp->trace_me) kprintf("trace\n");
  183. break;
  184. case 10: if (!crp->trace_me) kprintf("line-A emulation\n");
  185. crp->result = SIGEMT; break;
  186. case 11: if (!crp->trace_me) kprintf("Line-F emulation\n");
  187. crp->result = SIGEMT; break;
  188. }
  189. if (!crp->trace_me)
  190. {
  191. phys_pc = (long)LTP(save.pc);
  192. if (phys_pc != -1) insn_surround(save.pc);
  193. else kprintf("Program address not mapped\n");
  194. }
  195. if (0x2000&~save.flags)
  196. {
  197. int trace = crp->trace_me;
  198. if (!trace)
  199. crp->state = 'X';
  200. else
  201. {
  202. crp->state = 'T';
  203. crp->result = W_STOPCODE(crp->result);
  204. }
  205. sched();
  206. if (!trace) kprintf("Restored PC = %X USP = %X URP = %X\n",
  207. crp->registers.pc,
  208. crp->registers.save[15],
  209. (long)crp);
  210. }
  211. else
  212. {
  213. kprintf("Exception occurred in supervisor mode\n");
  214. kInterval = 0;
  215. __exit(1);
  216. }
  217. }
  218. save = crp->registers;
  219. put_user_root((long)crp);
  220. if (virtual) EnterSupervisorMode();
  221. put_usp(save.save[15]);
  222. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  223. ;
  224. ;
  225. asm
  226. {
  227. move.l save.save[14],(a6)
  228. move.w save.flags,4(a6)
  229. move.l save.pc,6(a6)
  230. movem.l save.save,d0-d7/a0-a5
  231. unlk a6
  232. rte
  233. };
  234. }
  235. kprintf("New stack size = %d pages\n", newstacksize/page_size);
  236. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  237. asm
  238. {
  239. movem.l save.save,d0-d7/a0-a5
  240. unlk a6
  241. rte
  242. };
  243. }
  244.